/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DriverDiccionarioPalabras;

import java.io.*;

/**
 *
 * @author Juan Manuel Fuentes Diaz; 46713095A
 */
public class DriverDiccionarioPalabras {

    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static int i;
    static DiccionarioPalabras dp = new DiccionarioPalabras();

    public static void main(String[] args) throws Exception {
        i = 0;
        while (i != 1 && i != 2) {
            System.out.println();
            System.out.println("****************************************************************");
            System.out.println("               DRIVER DICCIONARIO PALABRAS");
            System.out.println("****************************************************************");
            System.out.println();
            System.out.println();
            System.out.println("1-  Crear nuevo diccionario");
            System.out.println("2-  Cargar diccionario ya existente");
            System.out.println();
            try {
                i = Integer.parseInt(in.readLine());
            } catch (IOException e) {
                System.out.println("Error: " + e.getMessage());
            }


            switch (i) {
                case 1: {
                    crearDiccionario(dp);
                    break;
                }
                case 2: {
                    dp = cargarDiccionario();
                    break;
                }
                default:
                    break;
            }
        }


        System.out.println();
        System.out.println("****************************************************************");
        System.out.println("               DRIVER DICCIONARIO PALABRAS");
        System.out.println("****************************************************************");
        System.out.println();
        System.out.println();
        System.out.println("1-  Anadir una nueva Palabra al diccionario de Palabras");
        System.out.println("2-  Consultar la existencia de una Palabra en el diccionario");
        System.out.println("3-  Total de Palabras  en el diccionario.");
        System.out.println("4-  Listar los arboles AVL's del diccionario");
        System.out.println("5-  Consultar id de una Palabra.");
        System.out.println("6-  Guardar diccionario de palabras desde disco");
        System.out.println("7-  Abrir fichero plano de texto ");
        System.out.println("-1  Salir");
        System.out.println();

        try {
            i = Integer.parseInt(in.readLine());
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
        while (i != -1) {
            switch (i) {
                case 1: {
                    addPalabra(dp);
                    break;
                }
                case 2: {
                    estaPalabra(dp);
                    break;
                }
                case 3: {
                    getTotalPalabras(dp);
                    break;
                }
                case 4: {
                    writeAvl(dp);
                    break;
                }
                case 5: {
                    getIdPalabra(dp);
                    break;
                }
                case 6: {
                    guardarDiccionario(dp);
                    break;
                }
                case 7: {
                    addFichero(dp);
                    break;
                }
                default:
                    break;
            }
            System.out.println();
            System.out.println("****************************************************************");
            System.out.println("               DRIVER DICCIONARIO PALABRAS");
            System.out.println("****************************************************************");
            System.out.println();
            System.out.println();
            System.out.println("1-  Anadir una nueva Palabra al diccionario de Palabras");
            System.out.println("2-  Consultar la existencia de una Palabra en el diccionario");
            System.out.println("3-  Total de Palabras  en el diccionario.");
            System.out.println("4-  Listar los arboles AVL's del diccionario");
            System.out.println("5-  Consultar id de una Palabra.");
            System.out.println("6-  Guardar diccionario de palabras desde disco");
            System.out.println("7-  Abrir fichero plano de texto ");
            System.out.println("-1  Salir");
            System.out.println();
            try {
                i = Integer.parseInt(in.readLine());
            } catch (IOException e) {
                System.out.println("Error: " + e.getMessage());
            }
        }
    }

    private static void crearDiccionario(DiccionarioPalabras dp) {
        dp.crearDiccionarioVacio();
    }

    private static void addFichero(DiccionarioPalabras dp) throws Exception {
        System.out.println("Escribe el archivo txt (ejemplo en windows: c:\\dicESPMAX.txt");
        System.out.println("(primera linea con numero total de palabras, y las siguientes solo palabras)");
        try {
            String fi = in.readLine();
            File f = new File(fi);
            BufferedReader entrada = new BufferedReader(new FileReader(f));
            int q = Integer.parseInt(entrada.readLine());
            Palabra2[] x = new Palabra2[q];
            for (int i = 0; i < q; i++) {
                x[i] = new Palabra2();
            }
            String pal;
            char[] nacc = {'A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u'};
            char[] acc = {'\u00c0', '\u00c1', '\u00c2', '\u00c4', '\u00c8', '\u00c9', '\u00ca', '\u00cb', '\u00cc', '\u00cd', '\u00ce', '\u00cf', '\u00d2', '\u00d3', '\u00d4', '\u00d6', '\u00d9', '\u00da', '\u00db', '\u00dc', '\u00e0', '\u00e1', '\u00e2', '\u00e4', '\u00e8', '\u00e9', '\u00ea', '\u00eb', '\u00ec', '\u00ed', '\u00ee', '\u00ef', '\u00f2', '\u00f3', '\u00f4', '\u00f6', '\u00f9', '\u00fa', '\u00fb', '\u00fc'};
            for (int i = 0; i < q; i++) {
                pal = entrada.readLine();
                for (int j = 0; j < acc.length; j++) {
                    
                    pal = pal.replace(acc[j], nacc[j / 4]);
                   
                }
                x[i].setValor(pal);
                if (!(dp.existLetra(x[i].getValor().charAt(0)))) {
                    System.out.println("Primera letra de palabra invalida: "+x[i].getValor());
                } else if (dp.existPalabra(x[i].getValor()) != 0) {
                    System.out.println("La palabra cuyo string es " + x[i].getValor() + " ya existe");
                } else {

                    if (dp.addPalabra(x[i])) {
                    //System.out.println("insertado " + x[i].getValor() + "\n");
                    } else {
                        System.out.println("no se ha insertado la palabra :\"" + x[i].getValor() + "\"");
                    }
                }
            }
            System.out.print("\n");
            System.out.println("Diccionario cargado");
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }

    private static void addPalabra(DiccionarioPalabras dp) {
        String str;
        System.out.println("Escribe la palabra a insertar: ");
        try {
            str = in.readLine();
            if (!(dp.existLetra(str.charAt(0)))) {
                System.out.println("Primera letra de palabra invalida");
            } else if (dp.existPalabra(str) != 0) {
                System.out.println("La palabra cuyo string es " + str + " ya existe");
            } else {
                Palabra2 pal2 = new Palabra2();
                pal2.setValor(str);
                if (dp.addPalabra(pal2)) {
                    System.out.println("Palabra insertada");
                } else {
                    System.out.println("Palabra no insertada");
                }
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }

    private static void estaPalabra(DiccionarioPalabras dp) {
        String str;
        System.out.println("Escribe la palabra a consultar (si existe devuelve su id): ");
        try {
            str = in.readLine();
            if (!(dp.existLetra(str.charAt(0)))) {
                System.out.println("Primera letra de palabra invalida");
            } else if (dp.existPalabra(str) != 0) {
                System.out.println("La palabra cuyo string es " + str + " existe y su id es: " + dp.existPalabra(str));

            } else {
                System.out.println("La palabra cuyo string es " + str + " no existe");
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }

    private static void getTotalPalabras(DiccionarioPalabras dp) {
        System.out.println("Palabras en diccionario: " + dp.getTotalPalabras());
    }

    private static void writeAvl(DiccionarioPalabras dp) {
        System.out.println("Los Avl's con un solo elemento no se escriben");
        System.out.println("Ejemplo: cosa(1)(3)->hijo izquierdo: bola(0)(1), hijo derecho: dado(0)(1)");
        System.out.println("Donde el primer paréntesis es la altura del nodo y el segundo el número de elementos del arbol cuya raiz es el nodo");
        System.out.println("        cosa(1)(3)         ");
        System.out.println("         /      \\          ");
        System.out.println("  bola(0)(1)   dado(0)(1)   ");
        System.out.println("");
        dp.estructura();
    }

    private static void getIdPalabra(DiccionarioPalabras dp) {
        int id;
        if (dp.getTotalPalabras() == 0) {
            System.out.println("No hay palabras en diccionario");
        } else {
            System.out.println("Escribe la id de la palabra (rango : 1 - " + dp.getTotalPalabras() + "): ");
            try {
                id = Integer.parseInt(in.readLine());
                if (id < 1 || id > dp.getTotalPalabras()) {
                    System.out.println("Id no válido");
                } else {
                    Palabra pal2;
                    pal2 = dp.consultarPalabra(id);
                    System.out.println("La palabra con id " + id + "tiene como strig: " + pal2.getValor());
                }
            } catch (IOException e) {
                System.out.println("Error: " + e.getMessage());
            }
        }
    }

    private static DiccionarioPalabras cargarDiccionario() {
        Disco d = new Disco();
        System.out.println("Escribe la ruta completa del path donde se aloja el archivo :");
        System.out.println("(Recuerda que en windows los separadores son \\ y en Linux /)");
        String file;
        try {
            file = (in.readLine());
            dp = (DiccionarioPalabras) d.getObject(file);

        } catch (Exception e) {
            System.out.println("Error al cargar el diccionario");
            dp = new DiccionarioPalabras();
            i = 0;
        }
        System.out.println("Diccionario cargado");
        return dp;
    }

    private static void guardarDiccionario(DiccionarioPalabras dp) throws Exception {
        Disco d = new Disco();
        System.out.println("Escribe la ruta completa del path donde alojar el archivo :");
        System.out.println("(Recuerda que en windows los separadores son \\ y en Linux /)");
        String file;
        try {
            file = (in.readLine());
            d.writeObject(dp, file);
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
